package com.niit.aop;

import com.niit.service.UserService;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.reflect.Pointcut;

// 切面 Aspect
public class LogAspect {

    public void beforeLog(){
        System.out.println("方法开始执行......");
    }

    public void afterLog(){
        System.out.println("方法执行结束......");
    }

    public void afterReturningLog(JoinPoint joinPoint){// joinPoint 可以获取当前正在执行的目标方法的信息
        System.out.println(joinPoint.getSignature().getName()+"方法，return执行之后......");
        Object[] args = joinPoint.getArgs();// 获取目标方法参数列表
        System.out.println("切面中获取到的第一个参数:"+args[0]);
        Object obj = joinPoint.getTarget();  // 获取目标方法所在的类的对象: UserService或者DeptService

    }

    public void afterThrowingLog(){// joinPoint 可以获取当前正在执行的目标方法的信息
        System.out.println("目标方法出现异常");

    }

    public void aroundLog(ProceedingJoinPoint joinPoint) {

        System.out.println(joinPoint.getSignature().getName()+"方法执行之前");
        // TODO proceed()执行之前的内容，相当于before advice实现的逻辑
        System.out.println("proceed之前(before),获取方法参数:"+joinPoint.getArgs()[0]);

        // getUsers/getDepts方法的实际调用
        Object result = null;
        try {
            result = joinPoint.proceed();
        } catch (Throwable e) {
            System.out.println("异常,相当于after thorwing 通知");
        }

        // TODO proceed()执行之后的内容，相当于after advice实现的逻辑
        System.out.println("proceed之前(after),获取方法返回值:"+result);
    }
}
